package com.qf.common.core.interceptor;

import com.qf.common.core.annotation.NoLogin;
import com.qf.common.core.constants.CommonConstants;
import com.qf.common.core.util.JwtUtils;
import com.qf.common.core.util.TokenUtils;
import com.qf.common.core.util.UserUtils;
import io.jsonwebtoken.Claims;
import org.springframework.stereotype.Component;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.lang.reflect.Method;

/**
 * 天--道--酬--勤
 *
 * @author LiangGaoQiang
 * @ClassName LoginInterceptor
 * @Date: 2025/5/22 13:57
 * @Description: 描述
 */
@Component
public class LoginInterceptor implements HandlerInterceptor {

    /*
     * 拦截器触发
     * */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("拦截器触发: " + request.getRequestURI());

        // 控制层方法封装为了HandlerMethod对象。
        if (handler instanceof HandlerMethod){
            HandlerMethod handlerMethod = (HandlerMethod) handler;
            Method method = handlerMethod.getMethod();

            // 1. 判断访问的控制层方法上是否有 @NoLogin 注解
            if (method.isAnnotationPresent(NoLogin.class)){
                // 2. 如果访问的方法有 @NoLogin 注解，则直接放行
                System.out.println("方法上有 @NoLogin，放行请求");
                return true;
            }
            // 3.  如果访问的方法没有 @NoLogin 注解，则进行登录验证
            String token = request.getHeader(CommonConstants.Login_Token);
            // 4. token不存在，则返回未登录状态码，跳转到登录页面
            if (token == null || token.isEmpty()){
                throw new Exception("token不存在，请先登录");
            }
            // 5. token存在，则正常解析token，并返回用户信息

            try {
                Claims claims = JwtUtils.parseJWT(token);
                // 将uid存储到THreadLocal中
                UserUtils.setUid(Integer.valueOf(claims.get("uid").toString()));
            }catch (Exception e){
                throw new Exception("token解析失败");
            }
        }
        return true;
    }
}
